﻿Imports System.IO
'Imports agi_CLIENTE_Configuracion
Imports Configuracion.AGeNomaCore.EAccion 'Propio Agenoma

Public Class wucAdjuntos
   ''
#Region "Clase ArchivoAdjunto"

   Private Class clsArchivoAdjunto
      Private strNombreArchivo As String
      Private strNombreCompleto As String
      Private bolNuevo As Boolean
      ''' <summary>
      ''' Acciones (agregar o eliminar fichero) a realizar
      ''' </summary>
      ''' <remarks></remarks>
      Enum eAccionAdjunto
         Agregar
         Eliminar
      End Enum
      ''
      Public Property NombreArchivo() As String
         Get
            Return strNombreArchivo
         End Get
         Set(ByVal value As String)
            strNombreArchivo = value
         End Set
      End Property

      Public Property Nuevo() As Boolean
         Get
            Return bolNuevo
         End Get
         Set(ByVal value As Boolean)
            bolNuevo = value
         End Set
      End Property

      Public Property NombreCompleto() As String
         Get
            Return strNombreCompleto
         End Get
         Set(ByVal value As String)
            strNombreCompleto = value
         End Set
      End Property

      Public Overrides Function ToString() As String
         Return strNombreArchivo
      End Function
      ''
#Region "                                                               AccionAdjunto"
      Private p_AccionAdjunto As eAccionAdjunto
      ''' <summary>
      ''' Acción a realizar con el adjunto (Agregar o eliminar)
      ''' </summary>
      ''' <value></value>
      ''' <returns></returns>
      ''' <remarks></remarks>
      Public Property AccionAdjunto() As eAccionAdjunto
         Get
            Return p_AccionAdjunto
         End Get
         Set(ByVal value As eAccionAdjunto)
            p_AccionAdjunto = value
         End Set
      End Property
#End Region
      ''
   End Class
#End Region '"Clase ArchivoAdjunto"
   ''
#Region "Variables privadas"
   'Private _colArchivosAdjuntos As New Collection
   'Private _colArchivosAdjuntosACopiar As New Collection
   'Private _colArchivosAdjuntosAEliminar As New Collection
   'Private _strRutaAdjuntosActual As String
#Region "                                                               CtrlContieneId"
   Private p_CtrlContieneId As Control
   ''' <summary>
   ''' Cúal es el control que contiene el id de la carpeta? EJ: 1 - Juan (1 es id)
   ''' </summary>
   ''' <value></value>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Property CtrlContieneId() As Control
      Get
         Return p_CtrlContieneId
      End Get
      Set(ByVal value As Control)
         p_CtrlContieneId = value
      End Set
   End Property
#End Region
#Region "                                                               CtrlContieneDescripcion"
   Private p_CtrlContieneDescripcion As Control
   ''' <summary>
   ''' Cúal es el control que contiene la descripcion de la carpeta? EJ: 1 - Juan (Juan es descripción)
   ''' </summary>
   ''' <value></value>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Property CtrlContieneDescripcion() As Control
      Get
         Return p_CtrlContieneDescripcion
      End Get
      Set(ByVal value As Control)
         p_CtrlContieneDescripcion = value
      End Set
   End Property
#End Region
#Region "                                                               strSubCarpetaindicada "
   Private p_strSubCarpetaindicada As String
   ''' <summary>
   ''' Subcarpeta donde se guardan los adjuntos. EJ: P:\Adhara\Adjuntos\agiKnowCliente\ (SubCarpeta es agiKnowCliente)
   ''' </summary>
   ''' <value></value>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Property strSubCarpetaindicada() As String
      Get
         Return p_strSubCarpetaindicada
      End Get
      Set(ByVal value As String)
         p_strSubCarpetaindicada = value
      End Set
   End Property
#End Region
   Private _dicAccionesToDo As New System.Collections.Generic.Dictionary(Of String, clsArchivoAdjunto) ' Sustituye las collections por Acciones
   Private MensajeSegunIdioma, _strUbicacionRepositorio, m_IDActual, _strCarpeta, _strSubCarpeta As String
   Private ToolTipGenerico As System.Windows.Forms.ToolTip
   Enum eIdioma
      Espanol
      Catalan
   End Enum
   'Enum eAccionFormPadre
   '   Agregar
   '   Eliminar
   '   Consulta
   'End Enum
   '#Region "                                                               AccionFormPadre"
   '   Private p_AccionFormPadre As eAccionFormPadre
   '   ''' <summary>
   '   ''' Accion del formulario padre....
   '   ''' </summary>
   '   ''' <value></value>
   '   ''' <returns></returns>
   '   ''' <remarks></remarks>
   '   Public Property AccionFormPadre() As eAccionFormPadre
   '      Get
   '         Return p_AccionFormPadre
   '      End Get
   '      Set(ByVal value As eAccionFormPadre)
   '         p_AccionFormPadre = value
   '      End Set
   '   End Property
   '#End Region
   Private p_Idioma As eIdioma = eIdioma.Catalan
#End Region '"Variables privadas"
   ''
#Region "Constructor"
   Public Sub New()
      ' This call is required by the Windows Form Designer.
      InitializeComponent()
      ' Add any initialization after the InitializeComponent() call.
      BorrarColeccionesDeDatos()
   End Sub

   Public Sub BorrarColeccionesDeDatos()
      '_colArchivosAdjuntos.Clear()
      '_colArchivosAdjuntosACopiar.Clear()
      '_colArchivosAdjuntosAEliminar.Clear()
      _dicAccionesToDo.Clear()
      lstAdjuntos.Items.Clear()
   End Sub
#End Region '"Constructor"
   ''
#Region "Propiedades públicas"
   Public Property Idioma() As eIdioma
      Get
         Return p_Idioma
      End Get
      Set(ByVal value As eIdioma)
         p_Idioma = value
      End Set
   End Property

   Public Property Carpeta() As String
      Get
         Return _strCarpeta
      End Get
      Set(ByVal value As String)
         _strCarpeta = value
      End Set
   End Property

   Public Property SubCarpeta() As String
      Get
         Return _strSubCarpeta
      End Get
      Set(ByVal value As String)
         _strSubCarpeta = value
      End Set
   End Property

   Public Property UbicacionRepositorio() As String
      Get
         Return _strUbicacionRepositorio
      End Get
      Set(ByVal value As String)
         _strUbicacionRepositorio = value
         If Not _strUbicacionRepositorio Is Nothing AndAlso _
                  (_strUbicacionRepositorio = String.Empty OrElse _
          System.IO.Directory.Exists(_strUbicacionRepositorio) = False) Then
            Enabled = False
         End If
      End Set
   End Property
   ''
   'Public ReadOnly Property ArchivosAdjuntos() As Collection
   '   Get
   '      Dim iteArchivo As Object
   '      _colArchivosAdjuntos.Clear()
   '      For Each iteArchivo In lstAdjuntos.Items
   '         _colArchivosAdjuntos.Add(iteArchivo)
   '      Next
   '      Return _colArchivosAdjuntos
   '   End Get
   'End Property
   ' ''
   'Public Property ArchivosAdjuntosACopiar() As Collection
   '   Get
   '      Dim adjArchivo As clsArchivoAdjunto
   '      _colArchivosAdjuntosACopiar.Clear()
   '      For Each adjArchivo In lstAdjuntos.Items
   '         If adjArchivo.Nuevo Then
   '            _colArchivosAdjuntosACopiar.Add(adjArchivo)
   '         End If
   '      Next
   '      Return _colArchivosAdjuntosACopiar
   '   End Get
   '   Set(ByVal value As Collection)
   '      _colArchivosAdjuntosACopiar = value
   '   End Set
   'End Property

   'Public Property ArchivosAdjuntosAEliminar() As Collection
   '   Get
   '      Return _colArchivosAdjuntosAEliminar
   '   End Get
   '   Set(ByVal value As Collection)
   '      _colArchivosAdjuntosAEliminar = value
   '   End Set
   'End Property

   ''Public Property strRutaAdjuntosActual() As String
   ''   Get
   ''      Return _strRutaAdjuntosActual
   ''   End Get
   ''   Set(ByVal value As String)
   ''      _strRutaAdjuntosActual = value
   ''   End Set
   ''End Property
   ''
   Public Property IDActual() As String
      Get
         Return m_IDActual
      End Get
      Set(ByVal value As String)
         m_IDActual = value
      End Set
   End Property
#End Region '"Propiedades públicas"
   ''
#Region "Actualizar"
#Region " Obsoleto después Acciones"
   'Public Sub Actualizar()
   '   Dim di As System.IO.DirectoryInfo = Nothing

   '   Try
   '      If Not UbicacionRepositorio.Equals(String.Empty) AndAlso Enabled Then
   '         Dim adjArchivo As clsArchivoAdjunto
   '         Dim diCarpeta As IO.DirectoryInfo
   '         Dim strUbicacionSecundaria As String = UbicacionRepositorio & "\"

   '         If ArchivosAdjuntosACopiar.Count > 0 Then
   '            'Validar carpetas
   '            If Not Carpeta.Equals(String.Empty) Then
   '               strUbicacionSecundaria = strUbicacionSecundaria & Carpeta
   '               diCarpeta = New IO.DirectoryInfo(strUbicacionSecundaria)
   '               If Not diCarpeta.Exists Then diCarpeta.Create()
   '            End If
   '            '
   '            If Not SubCarpeta.Equals(String.Empty) Then
   '               strUbicacionSecundaria = strUbicacionSecundaria & "\" & SubCarpeta
   '               diCarpeta = New IO.DirectoryInfo(strUbicacionSecundaria)
   '               If Not diCarpeta.Exists Then diCarpeta.Create()
   '            End If
   '            '
   '            'Copiar
   '            For Each adjArchivo In ArchivosAdjuntosACopiar 'ArchivosAdjuntos
   '               If File.Exists(adjArchivo.NombreCompleto) Then
   '                  File.Copy(adjArchivo.NombreCompleto, strUbicacionSecundaria & "\" & adjArchivo.NombreArchivo, True)
   '               End If
   '            Next
   '         End If

   '         'Eliminar
   '         For Each adjArchivo In ArchivosAdjuntosAEliminar
   '            If File.Exists(adjArchivo.NombreCompleto) Then
   '               System.IO.File.SetAttributes(adjArchivo.NombreCompleto, IO.FileAttributes.ReadOnly = 0)
   '               File.Delete(adjArchivo.NombreCompleto)
   '            End If
   '         Next
   '         ArchivosAdjuntosAEliminar.Clear()

   '      End If
   '   Catch ex As Exception
   '      If Idioma = eIdioma.Espanol Then
   '         MensajeSegunIdioma = "Se han detectado problemas a la hora de actualizar los archivos adjuntos: "
   '      Else
   '         MensajeSegunIdioma = "S'han detectat problemes a l'hora d'actualitzar els arxius adjunts: "
   '      End If
   '      MsgBox(MensajeSegunIdioma & _
   '          ex.Message, MsgBoxStyle.Exclamation, "Error")
   '      'lstAdjuntos.Items.Clear()
   '   Finally
   '      If Not di Is Nothing Then di = Nothing
   '   End Try
   'End Sub
#End Region
   ''
   Public Sub ProcesarAccionesPendientes() 'Public Sub Actualizar()
      Dim di As System.IO.DirectoryInfo = Nothing
      Dim adjArchivo As clsArchivoAdjunto
      Dim diCarpeta As IO.DirectoryInfo
      Dim strUbicacionSecundaria As String = UbicacionRepositorio & "\"
      ''
      ''
      Try
         If Not UbicacionRepositorio.Equals(String.Empty) AndAlso Enabled AndAlso _dicAccionesToDo.Count > 0 Then
            'Validar carpetas
            If Not Carpeta.Equals(String.Empty) Then
               strUbicacionSecundaria = strUbicacionSecundaria & Carpeta
               diCarpeta = New IO.DirectoryInfo(strUbicacionSecundaria)
               If Not diCarpeta.Exists Then diCarpeta.Create()
            End If
            '
            If Not SubCarpeta.Equals(String.Empty) Then
               strUbicacionSecundaria = String.Format("{0}\{1}", strUbicacionSecundaria, SubCarpeta)
               diCarpeta = New IO.DirectoryInfo(strUbicacionSecundaria)
               If Not diCarpeta.Exists Then diCarpeta.Create()
            End If
            '
            'Realizar acciones
            For Each strKey As String In _dicAccionesToDo.Keys
               adjArchivo = _dicAccionesToDo(strKey)
               '
               With adjArchivo
                  If File.Exists(.NombreCompleto) Then 'Si existe el fichero (q no se haya borrado o renombrado desde el explorer)
                     Select Case .AccionAdjunto
                        Case clsArchivoAdjunto.eAccionAdjunto.Agregar
                           File.Copy(adjArchivo.NombreCompleto, String.Format("{0}\{1}", strUbicacionSecundaria, .NombreArchivo), True) 'Si existe el fichero lo sobreescribe
                        Case clsArchivoAdjunto.eAccionAdjunto.Eliminar
                           System.IO.File.SetAttributes(.NombreCompleto, IO.FileAttributes.ReadOnly = 0)
                           File.Delete(adjArchivo.NombreCompleto)
                     End Select
                     '_dicAccionesToDo.Remove(.NombreArchivo) 'Eliminar de la lista después de procesarlo 'No se puede dentro del bucle
                  End If
               End With
               '
            Next
            _dicAccionesToDo.Clear() 'Eliminar de la lista después de procesarlo
            ComprobarQuedanAdjuntosEnExplorer() 'Borrar la carpeta de adjuntos sino quedan ficheros
            '
         End If
         '
      Catch ex As Exception
         If Idioma = eIdioma.Espanol Then
            MensajeSegunIdioma = "Se han detectado problemas a la hora de actualizar los archivos adjuntos: "
         Else
            MensajeSegunIdioma = "S'han detectat problemes a l'hora d'actualitzar els arxius adjunts: "
         End If
         MsgBox(MensajeSegunIdioma & ex.Message, MsgBoxStyle.Exclamation, "Error")
      Finally : di = Nothing
      End Try
   End Sub
   ''
   ''
   ''' <summary>
   ''' Agrega al diccionario o lo quita 
   ''' </summary>
   ''' <param name="Accion"></param>
   ''' <param name="ArchivoAdjunto"></param>
   ''' <param name="bolAgregarQuitarDelListbox">Si tb lo ha de agregar o buscar y quitar al ListBox</param>
   ''' <remarks></remarks>
   Private Sub AgregarQuitarAdjunto(ByVal Accion As clsArchivoAdjunto.eAccionAdjunto, ByVal ArchivoAdjunto As clsArchivoAdjunto, _
                                    Optional ByVal bolAgregarQuitarDelListbox As Boolean = False)
      Dim strNombreArchivo As String = ArchivoAdjunto.NombreArchivo
      Dim intPos As Integer
      ''
      ''
      If _dicAccionesToDo.ContainsKey(strNombreArchivo) Then 'Si existe lo reemplaza por la última Acción
         _dicAccionesToDo(strNombreArchivo) = ArchivoAdjunto
      Else
         _dicAccionesToDo.Add(strNombreArchivo, ArchivoAdjunto)
      End If
      '
      If bolAgregarQuitarDelListbox Then
         Select Case Accion
            Case clsArchivoAdjunto.eAccionAdjunto.Agregar : lstAdjuntos.Items.Add(ArchivoAdjunto)
            Case clsArchivoAdjunto.eAccionAdjunto.Eliminar
               intPos = lstAdjuntos.FindString(strNombreArchivo)
               If intPos > -1 Then lstAdjuntos.Items.RemoveAt(intPos)
         End Select
      End If
   End Sub
   ''
   ''' <summary>
   ''' Si agregas y no guardas la lista clsArchivoAdjunto a eliminar contiene la ruta originbal del fichero y no 
   ''' la de adjuntos.. entonces te borrará el original. Esto sucede cuando control adjuntos no se cierra al guardar (como un panel de agenoma)
   ''' Aquí actualizamos la lista de ficheros a borrar por la ruta indicada
   ''' </summary>
   ''' <remarks></remarks>
   Public Sub CorregirListaElminacionesAdjuntos() 'ByVal RutaNuevaArchivosaEliminar As String)
      Dim NombreFichero As String = 0
      Dim RutaNuevaFileEliminar As String = String.Format("{0}\{1}\{2}", UbicacionRepositorio, Carpeta, SubCarpeta)
      Dim adjArchivo As clsArchivoAdjunto
      ''
      ''
      'Añadir ruta final
      'If Strings.Right(RutaNuevaArchivosaEliminar, 1) <> "\" Then RutaNuevaArchivosaEliminar &= "\"
      '
      '--------Obsoleto
      'Cambiar ruta de los ficheros a eliminar por la correcta
      'For Each adjArchivo As clsArchivoAdjunto In ArchivosAdjuntosAEliminar
      '   NombreFichero = ObtenerNombreSimple(adjArchivo.NombreCompleto)
      '   adjArchivo.NombreCompleto = RutaNuevaFileEliminar & "\" & NombreFichero
      'Next
      '
      For Each strKey As String In _dicAccionesToDo.Keys
         adjArchivo = _dicAccionesToDo(strKey)
         With adjArchivo
            If .AccionAdjunto = clsArchivoAdjunto.eAccionAdjunto.Eliminar Then
               NombreFichero = ObtenerNombreSimple(.NombreCompleto)
               .NombreCompleto = String.Format("{0}\{1}", RutaNuevaFileEliminar, NombreFichero)
            End If
         End With
      Next
   End Sub
#End Region '"Actualizar"

#Region "Utilidades WucAdjuntos"
   ''' <summary>
   ''' Comprueba que la descripcion del Gproy es igual que la de adjuntos. 
   ''' Sino es así muestra mensaje y actualiza según caso. Devuelve La descripción Final
   ''' </summary>
   ''' <remarks></remarks>
   Public Function ComprobarDescripcionAdjuntosHaCambiado(ByVal CodigoAdjuntos As String, _
                                                            ByVal CodigoGproy As String, _
                                                            ByVal CarpetaActualAdjuntos As String) As String
      Dim DescripcionParticionada As String()
      Dim NuevaDescripcion As String = String.Empty
      Dim IdActual As String = String.Empty
      Dim Ret As String = String.Empty
      Dim PosicionInicialBucle As Integer
      Dim PathEntries As String()
      Dim NombreAplicacion As String = String.Empty
      Dim DirectorioActualAdjuntos As String = String.Empty

      DirectorioActualAdjuntos = String.Format("{0}\{1}\", EntornoUI.PathAdjuntos, CarpetaActualAdjuntos)
      If Enabled AndAlso Directory.Exists(DirectorioActualAdjuntos) Then
         IdActual = CInt(CodigoGproy.Split("-")(0)) ' Strings.Left(CodigoGproy, CodigoGproy.IndexOf("-")).Trim, si no existe "-" (No pasa NADA)'TODO: Si CodigoGProy ES string.Empty (PETAAAA)

         'Comprobar si la carpeta  existe y si es necesario hacer la sincronización
         PathEntries = Directory.GetDirectories(DirectorioActualAdjuntos, IdActual & "*", SearchOption.AllDirectories)

         If PathEntries.Length > 0 Then
            '--Ofertas y solicitudes llevab id - codigo - descripcion y el bucle para comparar descripciones
            'ha de empezar en 4 (base 0) pero los demás solo llevan id - descripción así que el  bucle ha de empezar en 2 (base 0)
            If CarpetaActualAdjuntos = "Solicitudes" OrElse CarpetaActualAdjuntos = "Ofertas" Then
               PosicionInicialBucle = 4
            Else
               PosicionInicialBucle = 2
            End If
            '----

            If CodigoAdjuntos <> CodigoGproy Then
               NombreAplicacion = EntornoUI.NombreAplicación 'My.Application.Info.AssemblyName

               If Idioma = eIdioma.Espanol Then
                  MensajeSegunIdioma = "Se ha detectado que en el directorio '" & EntornoUI.PathAdjuntos & "\" & CarpetaActualAdjuntos & "' para el ID '" & IdActual & "' existe el directorio '" & _
                  CodigoAdjuntos & "' mientras que en '" & NombreAplicacion & "' es '" & CodigoGproy & "'" & vbNewLine & vbNewLine & _
                  "Desea cambiar la de '" & NombreAplicacion & "' para que coincida con la del directorio? " & vbNewLine & vbNewLine & _
                  "NOTA IMPORTANTE!: Aunque se vea reflejado, no se guardará hasta que no edite y guarde cambios"
               Else
                  MensajeSegunIdioma = "S'ha detectat que en el directori '" & EntornoUI.PathAdjuntos & "\" & CarpetaActualAdjuntos & "' per el ID '" & IdActual & "' existeix el directori '" & _
                  CodigoAdjuntos & "' mentres que en '" & NombreAplicacion & "' es '" & CodigoGproy & "'" & vbNewLine & vbNewLine & _
                  "Desitja canviar la de '" & NombreAplicacion & "' perquè coincideixi amb la del directori?" & vbNewLine & vbNewLine & _
                  "NOTA IMPORTANT!: Encara que es vegi reflectit, no es guardarà fins que no editi i guardi canvis"
               End If

               If MsgBox(MensajeSegunIdioma, MsgBoxStyle.Information + MsgBoxStyle.YesNo, My.Application.Info.AssemblyName) = MsgBoxResult.Yes Then
                  'Extraer descripción nueva
                  DescripcionParticionada = CodigoAdjuntos.Split(" - ")
                  For x As Integer = PosicionInicialBucle To DescripcionParticionada.Length - 1
                     NuevaDescripcion &= DescripcionParticionada(x) & " "
                  Next
                  If Not String.IsNullOrEmpty(NuevaDescripcion) Then
                     Ret = Strings.Left(NuevaDescripcion, Len(NuevaDescripcion) - 1)
                  End If
               End If
            End If
         End If
      End If

      Return Ret
   End Function

   ''' <summary>
   ''' Recorre el directorio de adjuntos y  cuando encuentra el id del control adjuntos actual lo renombra
   ''' </summary>
   ''' <remarks></remarks>
   Public Sub CambiarNombreAdjunto()
      Dim idaBuscar As String = String.Empty
      Dim CarpetaPrograma As String = String.Empty
      Dim strUbicacionSecundaria As String
      Dim diSubcarpetas As DirectoryInfo
      ''
      If Enabled Then
         'Componer ubicación archivos
         strUbicacionSecundaria = String.Format("{0}\", UbicacionRepositorio)
         If Not Carpeta.Equals(String.Empty) Then strUbicacionSecundaria = String.Format("{0}{1}\", strUbicacionSecundaria, Carpeta)
         '
         If Directory.Exists(strUbicacionSecundaria) Then
            'Comprobar solo hay una carpeta con ese Id Subcarpeta
            diSubcarpetas = New DirectoryInfo(strUbicacionSecundaria)
            idaBuscar = SubCarpeta.Split("-")(0) 'idaBuscar = Strings.Left(SubCarpeta, SubCarpeta.IndexOf("-")).Trim

            Dim IdDirectorioActual As String
            For Each Path As DirectoryInfo In diSubcarpetas.GetDirectories
               'Si se ha puesto guiones (en principio siempre)
               If InStr(Path.Name, "-") > 0 Then
                  IdDirectorioActual = Strings.Left(Path.Name, Path.Name.IndexOf("-")).Trim
               Else
                  IdDirectorioActual = Path.Name
               End If
               'comparamos actual subcarpeta con ID
               If IdDirectorioActual = idaBuscar Then
                  'Cambiamos nombre
                  'Rename(Path.FullName, strUbicacionSecundaria & SubCarpeta)
                  CarpetaPrograma = strUbicacionSecundaria & SubCarpeta
                  Try
                     If Path.FullName <> CarpetaPrograma Then
                        'My.Computer.FileSystem.RenameDirectory(Path.FullName, CarpetaPrograma)
                        Rename(Path.FullName, CarpetaPrograma)
                     End If
                  Catch ex As Exception
                     MsgBox("La carpeta no ha podido ser renombrada." & vbCrLf & "Compruebe que no tenga ningún archivo abierto." & vbCrLf & vbCrLf & "error detallado: " & ex.ToString)
                  End Try
                  Exit For
               End If
            Next
         Else
            Console.WriteLine(strUbicacionSecundaria & " directorio no existe. (CambiarNombreAdjunto de wucAdjuntos)")
         End If

      End If

   End Sub

   ''' <summary>
   ''' Devuelve true si la carpeta que estamos intentando crear ya existe en adjuntos y tiene ficheros
   ''' También llama a MasDeUnIdEnCarpetaAdjuntos
   ''' </summary>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function CarpetaAdjuntosExisteyTieneFicheros(ByRef ControlAdjuntos As wucAdjuntos, Optional ByVal bolMensaje As Boolean = True) As Boolean
      'TODO: Explicacion parametros
      Dim Ret As Boolean = False
      Dim dt As DataTable
      Dim Contador As Integer
      Dim DirectorioaExaminar As String
      Dim sSQlconMax As String = String.Empty

      If Enabled Then

         With ControlAdjuntos
            If String.IsNullOrEmpty(.SubCarpeta.Trim) OrElse .SubCarpeta.Trim = "0" Then
               'Comprobar si el número MAX ya existe en adjuntos 
               DirectorioaExaminar = .UbicacionRepositorio & "\" & .Carpeta & "\"
               sSQlconMax = "SELECT MAX(" & ObtenerPrimaryKeyTabla(.Carpeta) & ") FROM " & .Carpeta
            Else
               DirectorioaExaminar = .UbicacionRepositorio & "\" & .Carpeta & "\" & .SubCarpeta & "\"
            End If


            If sSQlconMax <> String.Empty Then
               'Obtener MAX
               dt = ObtenerDt(sSQlconMax)
               If IsDBNull(dt.Rows(0).Item(0)) Then
                  Contador = 1
               Else
                  Contador = dt.Rows(0).Item(0) + 1
               End If
            Else
               Contador = 0
            End If

            If Contador <> 0 Then DirectorioaExaminar = DirectorioaExaminar & Contador

            'Comprobar carpeta
            'Solo puedo hacer aquí MasDeUnIdEnCarpetaAdjuntos pq. aquí es donde se sabe el max q le toca
            If MasDeUnIdEnCarpetaAdjuntos(Contador, .UbicacionRepositorio & "\" & .Carpeta & "\", 0) Then Ret = True

            If Ret = False Then
               If System.IO.Directory.Exists(DirectorioaExaminar) AndAlso _
               System.IO.Directory.GetFiles(DirectorioaExaminar).Length > 0 Then
                  'If MsgBox("La carpeta '" & DirectorioaExaminar & "' ya contiene una carpeta de adjuntos con el nombre '" & Contador & "'. " & vbNewLine & _
                  '          "Si continua se agregarán los adjuntos a esa carpeta y puede originar adjuntos incoherentes. " & vbNewLine & _
                  '          "Desea eliminar la carpeta de adjuntos existente (" & Contador & ") primero?", _
                  '          MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, My.Application.Info.AssemblyName) = MsgBoxResult.Yes Then
                  '   EliminarCarpetaDefinitivo(DirectorioaExaminar & Contador, True)
                  Ret = True

                  If Idioma = eIdioma.Espanol Then
                     MensajeSegunIdioma = "La carpeta '" & DirectorioaExaminar & "' ya contiene archivos adjuntos." & vbNewLine & _
                     "El proceso de alta no continuará." & vbNewLine & "Desea abrir la carpeta ahora para comprobar su contenido?"
                  Else
                     MensajeSegunIdioma = "La carpeta '" & DirectorioaExaminar & "' ja conté arxius adjunts." & vbNewLine & _
                     "El procés d'alta no continuarà." & vbNewLine & "Desitja obrir la carpeta ara per a comprovar el seu contingut?"
                  End If

                  If bolMensaje Then
                     If MsgBox(MensajeSegunIdioma, MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton1, My.Application.Info.AssemblyName) = MsgBoxResult.Yes Then
                        System.Diagnostics.Process.Start("explorer.exe", DirectorioaExaminar)
                     End If
                  End If
               Else
                  Ret = False
               End If
            End If

         End With

      End If

      Return Ret
   End Function

   ''' <summary>
   ''' Eliminar un directorio y devuelve true si indicamos que si al mensaje de borrado
   ''' </summary>
   ''' <param name="SeccionEscogida"></param>
   ''' <param name="CodigoEscogido"></param>
   ''' <param name="BorrarSinMostrarAdvertenciaAdjuntos"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function EliminarCarpetaAdjuntos(ByVal SeccionEscogida As String, ByVal CodigoEscogido As String, _
                                                    Optional ByVal BorrarSinMostrarAdvertenciaAdjuntos As Boolean = False) As Boolean
      Dim Ret As Boolean = False

      If EntornoUI.PathAdjuntos <> String.Empty Then
         Dim DirectorioaBorrarAdjuntos As String = EntornoUI.PathAdjuntos & "\" & SeccionEscogida & "\" & CodigoEscogido
         Ret = EliminarCarpetaDefinitivo(DirectorioaBorrarAdjuntos, BorrarSinMostrarAdvertenciaAdjuntos)
      Else
         Ret = True
      End If

      Return Ret
   End Function

   ''' <summary>
   ''' Devuelve true si exise mas de una carpeta con ese id en adjuntos
   ''' Si solo existe una la asigna a .Subcarpeta
   ''' </summary>
   ''' <param name="idCompletoABuscar"></param>
   ''' <param name="StrRuta">Sino se le pasa ruta la cálcula automáticamente</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function MasDeUnIdEnCarpetaAdjuntos(ByVal idCompletoABuscar As String, _
                                                     ByVal StrRuta As String, _
                                                     Optional ByVal MaximosPermitidos As Integer = 1) As Boolean
      Dim Ret As Boolean = False
      Dim IdDirectorioActual As String
      Dim Resultados As Integer = 0
      ' Dim FileEntries As String()
      'Dim DirectoriosVaciosABorrar As New ArrayList
      Dim diSubcarpetas As New DirectoryInfo(StrRuta)
      Dim DirectorioActual As String = String.Empty

      'If StrRuta = "" Then
      '   'Componer ubicación archivos
      '   StrRuta = UbicacionRepositorio & "\"
      '   If Not Carpeta.Equals(String.Empty) Then
      '      StrRuta = StrRuta & Carpeta & "\"
      '   End If
      '   'Si solo hay un directorio con ese id seguimos
      '   If Not SubCarpeta.Equals(String.Empty) Then
      '      StrRuta = StrRuta & SubCarpeta & "\"
      '   End If
      'End If

      If Enabled AndAlso Directory.Exists(StrRuta) Then
         If InStr(idCompletoABuscar, "-") > 0 Then
            idCompletoABuscar = Strings.Left(idCompletoABuscar, idCompletoABuscar.IndexOf("-")).Trim
         End If

         For Each Path As DirectoryInfo In diSubcarpetas.GetDirectories
            'Si se ha puesto guiones (en principio siempre)
            If InStr(Path.Name, "-") > 0 Then
               IdDirectorioActual = Strings.Left(Path.Name, Path.Name.IndexOf("-")).Trim
            Else
               IdDirectorioActual = Path.Name
            End If
            'comparamos actual subcarpeta con ID
            If IdDirectorioActual = idCompletoABuscar Then
               'Comprobar si tiene ficheros y sino borrar
               'FileEntries = Directory.GetFiles(Path.FullName, "*.*", SearchOption.AllDirectories)
               'If FileEntries.Length = 0 Then
               '   DirectoriosVaciosABorrar.Add(Path.FullName)
               'Else
               Resultados += 1
               If Resultados > MaximosPermitidos Then
                  Ret = True

                  If Idioma = eIdioma.Espanol Then
                     MensajeSegunIdioma = "Existe mas de un directorio en '" & StrRuta & "' con el Id: '" & _
                     idCompletoABuscar & "'" & vbNewLine & "El proceso con archivos no continuará..." & vbNewLine & vbNewLine & _
                     "Desea abrir la carpeta adjuntos para revisarlo?"
                  Else
                     MensajeSegunIdioma = "Existeix mes d'un directori en '" & StrRuta & "' amb el Id: '" & _
                     idCompletoABuscar & "'" & vbNewLine & "El procés amb fitxers no continuarà..." & vbNewLine & vbNewLine & _
                     "Desitja obrir la carpeta adjunts per a revisar-lo?"
                  End If

                  If MsgBox(MensajeSegunIdioma, MsgBoxStyle.YesNo + MsgBoxStyle.Exclamation, My.Application.Info.AssemblyName) = MsgBoxResult.Yes Then
                     System.Diagnostics.Process.Start("explorer.exe", StrRuta)
                  End If
                  Exit For
               Else
                  DirectorioActual = Path.Name
               End If
               'End If

            End If
         Next

         'Solo hay uno entramos en la comprobación de la descripción
         If Resultados = 1 Then
            If SubCarpeta <> DirectorioActual Then
               'If MsgBox("Se ha detectado que el directorio para el ID " & m_IDActual & " tiene la descripción '" & _
               '          DirectorioActual & "' mientras que la descripción del Gproy es '" & SubCarpeta & "'" & vbNewLine & vbNewLine & _
               '          "Desea cambiar la descripción del Gproy para que coincida con la de la carpeta?", MsgBoxStyle.Information + MsgBoxStyle.YesNo, My.Application.Info.AssemblyName) = MsgBoxResult.Yes Then
               SubCarpeta = DirectorioActual
               'End If
            End If
         End If

         'Borrar directorios vacíos
         'For Each strDirectorio As String In DirectoriosVaciosABorrar
         '   If System.IO.Directory.GetDirectories(strDirectorio).Length > 0 Then
         '      MsgBox("No se puede borrar un directorio con subdirectorios en modo solo lectura programaticamente. Eliminelos a mano." & vbNewLine & _
         '             strDirectorio, MsgBoxStyle.Information, My.Application.Info.AssemblyName)
         '   Else
         '      System.IO.Directory.Delete(strDirectorio, True)
         '   End If
         'Next

      End If

      Return Ret
   End Function
#End Region

#Region "               Obsoleto.. de momento"
   ''''' <summary>
   ''''' Cuando Guardamos como nuevo los archivos adjuntos solo coge los agregados recientemente
   ''''' Esto lo corrige
   ''''' </summary>
   ''''' <returns></returns>
   ''''' <remarks></remarks>
   'Public Function ActualizarArchivosAdjuntosaCopiar() As Boolean
   '   Dim NuevaclsArchivoAdjunto As clsArchivoAdjunto

   '   For Each archivo As clsArchivoAdjunto In ArchivosAdjuntos
   '      If BuscarArchivosAdjuntosACopiar(archivo.NombreCompleto) = False Then
   '         'Adjuntamos a ArchivosAdjuntosACopiar
   '         NuevaclsArchivoAdjunto = New clsArchivoAdjunto
   '         With NuevaclsArchivoAdjunto
   '            .NombreCompleto = archivo.NombreCompleto 'OpenFileDialog.FileName
   '            .NombreArchivo = archivo.NombreArchivo
   '            .Nuevo = True
   '         End With
   '         _colArchivosAdjuntosACopiar.Add(NuevaclsArchivoAdjunto)
   '         'ArchivosAdjuntosACopiar.Add(NuevaclsArchivoAdjunto)
   '         'Dim iteArchivo As Object
   '         '_colArchivosAdjuntos.Clear()
   '         'For Each iteArchivo In lstAdjuntos.Items
   '         '   _colArchivosAdjuntos.Add(iteArchivo)
   '         'Next

   '      End If
   '   Next
   'End Function

   '''' <summary>
   '''' Busca un NombreCompleto dentro de ArchivosAdjuntosACopiar y devuelve true si lo encuentra
   '''' </summary>
   '''' <param name="strarchivo"></param>
   '''' <returns></returns>
   '''' <remarks></remarks>
   'Public Function BuscarArchivosAdjuntosACopiar(ByVal strarchivo As String) As Boolean
   '   Dim Ret As Boolean = False

   '   For Each archivo As clsArchivoAdjunto In ArchivosAdjuntosACopiar
   '      If archivo.NombreCompleto.Trim = strarchivo.Trim Then
   '         Ret = True
   '         Exit For
   '      End If
   '   Next

   '   Return Ret
   'End Function
#End Region

#Region "CargarArchivos"

   ''' <summary>
   ''' Devuelve la ruta completa de adjuntos en este momento. Ej: P:\GPROY\Adjuntos\Ofertas\829 - HT0900AGC - Descrip1
   ''' </summary>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Private Function ObtenerRutaCompletaAdjuntos() As String
      'Componer ubicación archivos
      Dim strUbicacionSecundaria As String = String.Empty
      ''
      If Enabled Then
         strUbicacionSecundaria = String.Format("{0}\", UbicacionRepositorio)
         If Not Carpeta.Equals(String.Empty) Then strUbicacionSecundaria = String.Format("{0}{1}\", strUbicacionSecundaria, Carpeta)
         'Si solo hay un directorio con ese id seguimos
         If Not SubCarpeta.Equals(String.Empty) Then strUbicacionSecundaria = String.Format("{0}{1}\", strUbicacionSecundaria, SubCarpeta)
      End If

      Return strUbicacionSecundaria
   End Function
   ''
   ''' <summary>
   ''' Devuelve true si se produjo la carga de archivos o si el directorio de adjuntos no existe y false sino se produjo la carga
   ''' </summary>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function CargarArchivos() As Boolean
      Dim IDaBuscar As String = String.Empty
      Dim Ret As Boolean = False
      Dim CarpetaAdjuntos As String = String.Empty

      Try
         If Enabled Then
            If Not UbicacionRepositorio.Equals(String.Empty) Then

               'Dim adjArchivo As clsArchivoAdjunto
               'Dim diCarpeta As IO.DirectoryInfo

               'Componer ubicación archivos
               Dim strUbicacionSecundaria As String = UbicacionRepositorio & "\"
               If Not Carpeta.Equals(String.Empty) Then
                  strUbicacionSecundaria = String.Format("{0}{1}\", strUbicacionSecundaria, Carpeta)
               End If
               '
               'Si solo hay un directorio con ese id seguimos
               If Not SubCarpeta.Equals(String.Empty) Then strUbicacionSecundaria = String.Format("{0}{1}\", strUbicacionSecundaria, SubCarpeta)
               '
               'Comprobar si id+descripcion existe y sino asignarle solo Id
               'If Not System.IO.Directory.Exists(strUbicacionSecundaria) Then
               '   Dim Directorio As String = String.Empty
               '   Dim IdTratado As String()
               '   Dim d As New DirectoryInfo(strUbicacionSecundaria)
               '   'Sino se encuentra por el nombre pasado dar opción de buscar por ID
               '   IdTratado = SubCarpeta.Split("-")
               '   'Obtengo solo el ID para buscar por él
               '   strUbicacionSecundaria = d.Parent.FullName & "\" & IdTratado(0).Trim & "\"
               'End If
               CarpetaAdjuntos = String.Format("{0}\{1}\", UbicacionRepositorio, Carpeta)
               If Directory.Exists(CarpetaAdjuntos) AndAlso MasDeUnIdEnCarpetaAdjuntos(m_IDActual, UbicacionRepositorio & "\" & Carpeta & "\", 1) = False Then
                  'Comprobar de nuevo la 
                  strUbicacionSecundaria = ObtenerRutaCompletaAdjuntos()

                  'Obtener lista de archivos
                  If System.IO.Directory.Exists(strUbicacionSecundaria) Then
                     Dim diCarpeta As New DirectoryInfo(strUbicacionSecundaria)
                     Dim fiArchivos() As FileInfo
                     Dim adjArchivo As clsArchivoAdjunto
                     fiArchivos = diCarpeta.GetFiles("*.*")
                     For Each diArchivo As FileInfo In fiArchivos
                        adjArchivo = New clsArchivoAdjunto
                        With adjArchivo
                           .Nuevo = False
                           .NombreCompleto = diArchivo.FullName
                           .NombreArchivo = ObtenerNombreSimple(.NombreCompleto)
                        End With
                        lstAdjuntos.Items.Add(adjArchivo)
                        Ret = True
                     Next diArchivo
                  Else
                     Ret = True
                  End If

               Else
                  Ret = False
               End If

            End If
         Else
            Ret = True
         End If
         Return Ret
         '
      Catch ex As Exception : MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
      End Try
   End Function

#End Region '"CargarArchivos"

#Region "Alta"
   Private Sub btnAltaModulos_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles btnAltaModulos.Click
      Dim intPos As Integer
      Dim adjArchivo As clsArchivoAdjunto
      Dim Escogidos() As String
      ''
      ''
      If OpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
         Escogidos = OpenFileDialog.FileNames
         '
         For Each fichEscogido As String In Escogidos
            adjArchivo = New clsArchivoAdjunto
            With adjArchivo
               .NombreCompleto = fichEscogido 'OpenFileDialog.FileName
               .NombreArchivo = ObtenerNombreSimple(.NombreCompleto)
               .Nuevo = True
            End With
            intPos = lstAdjuntos.FindString(adjArchivo.NombreArchivo)
            '
            If intPos > -1 Then
               If Idioma = eIdioma.Espanol Then
                  MensajeSegunIdioma = "Se ha detectado un archivo adjunto existente con el mismo nombre. " & _
                  "¿Desea sobrescribirlo?"
               Else
                  MensajeSegunIdioma = "S'ha detectat un arxiu adjunt existent amb el mateix nom." & _
                  "¿Desitja sobrescriure'l?"
               End If

               If MsgBox(MensajeSegunIdioma, MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo _
                   + MsgBoxStyle.DefaultButton2, "Advertencia") = MsgBoxResult.Yes Then
                  lstAdjuntos.Items.RemoveAt(intPos) : lstAdjuntos.Items.Add(adjArchivo)
               End If
            Else
               lstAdjuntos.Items.Add(adjArchivo)
               adjArchivo.AccionAdjunto = clsArchivoAdjunto.eAccionAdjunto.Agregar
               AgregarQuitarAdjunto(clsArchivoAdjunto.eAccionAdjunto.Agregar, adjArchivo)
            End If
         Next
         '
      End If
   End Sub
#End Region '"Alta"
   ''
#Region "Baja"
   Private Sub btnBajaModulo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBajaModulo.Click
      Dim oArchivoAdjunto As clsArchivoAdjunto
      ''
      If lstAdjuntos.SelectedIndex >= 0 Then
         oArchivoAdjunto = lstAdjuntos.Items(lstAdjuntos.SelectedIndex)
         oArchivoAdjunto.AccionAdjunto = clsArchivoAdjunto.eAccionAdjunto.Eliminar
         AgregarQuitarAdjunto(clsArchivoAdjunto.eAccionAdjunto.Eliminar, oArchivoAdjunto)
         '_colArchivosAdjuntosAEliminar.Add(lstAdjuntos.Items(lstAdjuntos.SelectedIndex))
         lstAdjuntos.Items.RemoveAt(lstAdjuntos.SelectedIndex)
      End If
      '      
   End Sub
   ''
   ''' <summary>
   ''' SIno queda ningún adjunto en la carpeta, borra la carpeta
   ''' </summary>
   ''' <remarks></remarks>
   Private Sub ComprobarQuedanAdjuntosEnExplorer()
      Dim DirectorioAdjuntosActual As String = String.Format("{0}\{1}\{2}", UbicacionRepositorio, Carpeta, SubCarpeta)
      ''
      'Si ya no hay archivos adjuntos eliminar la carpeta
      If Not SubCarpeta Is Nothing AndAlso lstAdjuntos.Items.Count = 0 AndAlso _
      Not String.IsNullOrEmpty(SubCarpeta.Trim) AndAlso Directory.Exists(DirectorioAdjuntosActual) Then
         System.IO.Directory.Delete(DirectorioAdjuntosActual, True)
      End If
   End Sub
#End Region '"Baja"
   ''
#Region "ObtenerNombreSimple"

   Private Function ObtenerNombreSimple(ByVal prmNombreCompleto As String) As String
      Dim strParticionado As String()
      strParticionado = Split(prmNombreCompleto, "\")
      Return strParticionado(strParticionado.GetUpperBound(0))
   End Function

#End Region '"ObtenerNombreSimple"

#Region "                                         Envío Mail con PDF"
   'Private Sub btnSendMail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendMail.Click
   '   If lstAdjuntos.SelectedIndex >= 0 Then

   '      If Strings.Right(lstAdjuntos.Items(lstAdjuntos.SelectedIndex).nombrearchivo, 4) = ".pdf" Then
   '         'Es pdf
   '         Dim SmtpMail As New SmtpSendMail.frmSmtpSendMail(Me)
   '         SmtpMail.Show()
   '      Else
   '         MsgBox("Solo se pueden enviar archivos adjuntos con la extensión '.pdf'", MsgBoxStyle.Information, My.Application.Info.AssemblyName)
   '      End If

   '   End If
   'End Sub
#End Region


   Private Sub lstAdjuntos_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstAdjuntos.DoubleClick
      Try
         Dim adjArchivo As clsArchivoAdjunto
         adjArchivo = lstAdjuntos.Items(lstAdjuntos.SelectedIndex)
         System.Diagnostics.Process.Start(adjArchivo.NombreCompleto)
      Catch ex As Exception
         MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Error")
      End Try
   End Sub

   Private Sub btnAbrirRuta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrirRuta.Click
      Dim RutaCompletaCarpeta As String = String.Empty

      RutaCompletaCarpeta = UbicacionRepositorio & "\" & Carpeta & "\" & SubCarpeta
      If Directory.Exists(RutaCompletaCarpeta) Then
         System.Diagnostics.Process.Start("explorer.exe", """" & RutaCompletaCarpeta & """")
      Else
         If Idioma = eIdioma.Espanol Then
            MensajeSegunIdioma = String.Format("No se puede abrir la ruta: '{0}'. Es posible que el archivo adjunto aun no se haya creado", RutaCompletaCarpeta)
         Else
            MensajeSegunIdioma = String.Format("No es pot obrir la ruta: '{0}'. És possible que l'arxiu adjunt encara no s'hagi creat", RutaCompletaCarpeta)
         End If

         MsgBox(MensajeSegunIdioma, MsgBoxStyle.Information, My.Application.Info.AssemblyName)
      End If
   End Sub
   ''
#Region " ToolTips"
   Private Sub btnAltaModulos_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAltaModulos.MouseHover
      If Idioma = eIdioma.Espanol Then
         MensajeSegunIdioma = "Agregar Fichero"
      Else
         MensajeSegunIdioma = "Agregar Fitxer"
      End If
      MostrarMensajeToolTip(sender, MensajeSegunIdioma)
   End Sub

   Private Sub btnBajaModulo_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBajaModulo.MouseHover
      If Idioma = eIdioma.Espanol Then
         MensajeSegunIdioma = "Borrar fichero actualmente seleccionado"
      Else
         MensajeSegunIdioma = "Esborrar fitxer actualment seleccionat"
      End If
      MostrarMensajeToolTip(sender, MensajeSegunIdioma)
   End Sub

   Private Sub btnSendMail_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendMail.MouseHover
      If Idioma = eIdioma.Espanol Then
         MensajeSegunIdioma = "Enviar fichero pdf por mail"
      Else
         MensajeSegunIdioma = "Enviar fitxer pdf per mail"
      End If
      MostrarMensajeToolTip(sender, MensajeSegunIdioma)
   End Sub

   Private Sub btnAbrirRuta_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrirRuta.MouseHover
      If Idioma = eIdioma.Espanol Then
         MensajeSegunIdioma = "Abrir ruta contenedora archivos adjuntos"
      Else
         MensajeSegunIdioma = "Obrir ruta contenidora arxius adjunts"
      End If
      MostrarMensajeToolTip(sender, MensajeSegunIdioma)
   End Sub

   Private Sub MostrarMensajeToolTip(ByRef ObjSender As System.Object, _
                                     ByVal MensajeMostrado As String)
      If ToolTipGenerico Is Nothing Then ToolTipGenerico = New System.Windows.Forms.ToolTip

      With ToolTipGenerico
         .IsBalloon = True
         .SetToolTip(ObjSender, MensajeMostrado)
      End With
   End Sub
#End Region
   ''
#Region "         PropioControlAdjuntos"
   ''' <summary>
   ''' Solo devuelve el primer campo de la Primary Key
   ''' </summary>
   ''' <param name="NombreTabla"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function ObtenerPrimaryKeyTabla(ByVal NombreTabla As String) As String
      Dim Ret As String = String.Empty
      Dim Ssql As String = String.Empty
      Dim dt As New DataTable

      Ssql = " SELECT KU.column_name "
      Ssql &= " FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC "
      Ssql &= " INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU "
      Ssql &= " ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' "
      Ssql &= " AND TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME "
      Ssql &= " WHERE KU.TABLE_NAME = '" & NombreTabla & "' "

      dt = ObtenerDt(Ssql)
      Ret = dt.Rows(0).Item(0).ToString
      Return Ret
   End Function

   ''' <summary>
   ''' Eliminar un directorio (y sus archivos) y devuelve true si indicamos que si al mensaje de borrado
   ''' </summary>
   ''' <param name="DirectorioaBorrar"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function EliminarCarpetaDefinitivo(ByVal DirectorioaBorrar As String, _
                                                    Optional ByVal BorrarSinMostrarAdvertencia As Boolean = False) As Boolean
      Dim Ret As Boolean = False
      Dim MensajeTextBox As String
      Dim fileEntries As String()
      Dim Directorio As String = String.Empty
      Dim Fichero As String = String.Empty
      Dim RutaSeparada As New ArrayList

      If Not System.IO.Directory.Exists(DirectorioaBorrar) Then
         'Sino se encuentra por el nombre pasado dar opción de buscar por ID
         RutaSeparada = SepararFicheroDeRuta(DirectorioaBorrar)
         Directorio = RutaSeparada(0)
         Fichero = RutaSeparada(1)
         'Obtengo solo el ID para buscar por él
         Fichero = Strings.Left(Fichero, Fichero.IndexOf("-")).Trim
         If System.IO.Directory.Exists(Directorio & Fichero) Then
            DirectorioaBorrar = Directorio & Fichero
         Else
            Return True
         End If
      End If

      fileEntries = System.IO.Directory.GetFiles(DirectorioaBorrar)

      'COmprobar archivos adjuntos
      If fileEntries.Length > 0 AndAlso BorrarSinMostrarAdvertencia = False Then

         If Idioma = eIdioma.Espanol Then
            MensajeSegunIdioma = "Se han detectado archivos en la carpeta: '" & DirectorioaBorrar & "'" & _
                   vbNewLine & "¿Desea borrar los archivos?: " & vbNewLine & vbNewLine
         Else
            MensajeSegunIdioma = "S'han detectat arxius en la carpeta: '" & DirectorioaBorrar & "'" & _
                   vbNewLine & "Desitja esborrar els arxius?: " & vbNewLine & vbNewLine
         End If

         MensajeTextBox = MensajeSegunIdioma

         For Each ArchivoAdjunto As String In fileEntries
            MensajeTextBox &= " - " & Replace(ArchivoAdjunto, DirectorioaBorrar & "\", String.Empty) & vbNewLine
         Next

         If Idioma = eIdioma.Espanol Then
            MensajeTextBox &= vbNewLine & "Si escoge que NO se cancelará la eliminación."
         Else
            MensajeTextBox &= vbNewLine & "Si escull que NO es cancel·larà l'eliminació."
         End If

         If MsgBox(MensajeTextBox, MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2 + vbQuestion, My.Application.Info.AssemblyName) = MsgBoxResult.Yes Then
            'Borrando adjuntos
            Ret = True
            For Each Archivo As String In fileEntries
               System.IO.File.SetAttributes(Archivo, IO.FileAttributes.ReadOnly = 0)
            Next
            System.IO.Directory.Delete(DirectorioaBorrar, True)
         Else
            'Throw New Exception(String.Empty)
            Ret = False
         End If
      Else
         Ret = True
         For Each Archivo As String In fileEntries
            System.IO.File.SetAttributes(Archivo, IO.FileAttributes.ReadOnly = 0)
         Next
         System.IO.Directory.Delete(DirectorioaBorrar, True)
      End If

      Return Ret
   End Function

   ''' <summary>
   ''' Le pasa una ruta y te devuelve un arraylist donde la posición 0 es la ruta y la posición 1 es el archivo
   ''' ej: D:\Temp\a\1.pdf Devuelve 'D:\Temp\a\' en posición 0 y '1.pdf' en posición 1
   ''' </summary>
   ''' <param name="prmNombreCompleto"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Shared Function SepararFicheroDeRuta(ByVal prmNombreCompleto As String) As ArrayList
      Dim strParticionado As String()
      Dim Separacion As New ArrayList
      Dim Ruta As String = String.Empty

      strParticionado = Split(prmNombreCompleto, "\")
      For x As Integer = 0 To strParticionado.Length - 2
         Ruta &= strParticionado(x) & "\"
      Next

      Separacion.Add(Ruta)
      Separacion.Add(strParticionado(strParticionado.GetUpperBound(0)))
      'Return strParticionado(strParticionado.GetUpperBound(0))
      Return Separacion
   End Function


#Region "                                                               ExecuteSQLSelect"

   ''' <summary>
   ''' Ejecutar un commando SQL.
   ''' </summary>
   ''' <param name="selectCommandText">Commando SQL a procesar</param>
   ''' <returns>Tabla resultado</returns>
   ''' <remarks></remarks>
   Public Shared Function ObtenerDt(ByVal selectCommandText As String, _
                                       Optional ByVal bolLanzarMjeError As Boolean = True) As DataTable
      Dim dt As DataTable = Nothing
      Dim DataAdapter As System.Data.SqlClient.SqlDataAdapter
      Dim dataSet As DataSet

      Try
         If Not selectCommandText.Equals(String.Empty) Then
            '-----
            'Inicializar 
            'connection.Open()
            DataAdapter = New System.Data.SqlClient.SqlDataAdapter(selectCommandText, Configuracion.Entorno.OrigenDeDatosCliente)
            dataSet = New DataSet
            DataAdapter.Fill(dataSet, "DATOS")
            dt = dataSet.Tables(0)
            'connection.Close()
         End If
      Catch ex As Exception
         If Not dataSet Is Nothing Then dataSet.Dispose() : dataSet = Nothing
         If Not DataAdapter Is Nothing Then DataAdapter.Dispose() : DataAdapter = Nothing
         MsgBox(ex.Message, MsgBoxStyle.Critical, My.Application.Info.AssemblyName)
      End Try
      Return dt
   End Function

#End Region
#End Region

   '--------------------------------------------------------------------------------------------------------


#Region "                  Propio Agenoma"
   ''' <summary>
   ''' Establece el valor del control según sea Infragistics o NET. Después de establecerlo lo devuelve
   ''' </summary>
   ''' <param name="objControl"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Private Shared Function EstablecerValorDelControl(ByRef objControl As Control, _
                                                     ByVal oValorControl As Object) As Object
      Dim oControl As Object = DirectCast(objControl, Object)
      Try
         oControl.value = oValorControl : Return oControl.value
      Catch ex As Exception
         Try
            oControl.Text = oValorControl : Return oControl.Text
         Catch ex2 As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Error")
            Return String.Empty
         End Try
      End Try
   End Function
   ''
   ''' <summary>
   ''' Infragistics devuelve value, NET devuelve text
   ''' </summary>
   ''' <param name="objControl"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Private Shared Function DevolverValorDelControl(ByRef objControl As Control) As Object
      Dim Ret As Object
      Try
         Ret = DirectCast(objControl, Object).Value : Return Ret
      Catch ex As Exception
         Try
            Ret = objControl.Text : Return Ret
         Catch ex2 As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Error") : Return String.Empty
         End Try
      End Try
   End Function
   ''
   ''' <summary>
   ''' Inicializar o cargar adjuntos en control. Ha de estar informado 
   ''' </summary>
   ''' <param name="Accion">Accion Mto16 Agenoma</param>
   ''' <param name="bolActivarControl">Poner el control en Enabled?</param>
   ''' <remarks></remarks>
   Public Sub IniciarCargarControlAdjuntos(ByVal Accion As EAccion, Optional ByVal bolActivarControl As Boolean = True)
      Dim bolSeguir As Boolean = True
      Dim id As Integer
      Dim DescripcíonFinal, txt, sSubCarpeta As String
      Dim sCarpeta As String = p_strSubCarpetaindicada ' '"agiKnowCliente"
      ''
      id = DevolverValorDelControl(p_CtrlContieneId)
      txt = DevolverValorDelControl(p_CtrlContieneDescripcion)
      sSubCarpeta = String.Format("{0} - {1}", id, txt).Trim
      'Cargar control adjuntos
      With Me
         .Enabled = True
         .UbicacionRepositorio = EntornoUI.PathAdjuntos
         .Carpeta = sCarpeta
         .IDActual = id 'Me.numagiKnowID.Value
         .SubCarpeta = sSubCarpeta  'Sesion.agiIsNull(.IDActual & " - " & txtagiKnowTitulo.Text, "")
         If Accion = EAccion.Insercion AndAlso .CarpetaAdjuntosExisteyTieneFicheros(Me) Then bolSeguir = False
         If bolSeguir Then If Not String.IsNullOrEmpty(.SubCarpeta) Then bolSeguir = .CargarArchivos()
         '
         If Accion <> EAccion.Insercion Then 'If Me.TipoMantenimiento <> "Insertar" Then 
            DescripcíonFinal = ComprobarDescripcionAdjuntosHaCambiado(SubCarpeta, sSubCarpeta, Carpeta)
            If DescripcíonFinal <> String.Empty Then EstablecerValorDelControl(p_CtrlContieneDescripcion, DescripcíonFinal) ' Me.txtagiKnowTitulo.Text = DescripcíonFinal
            .Enabled = bolActivarControl
         End If
      End With
   End Sub
   ''
   ''' <summary>
   ''' Cambiar nombre de adjuntos?
   ''' </summary>
   ''' <param name="Accion">Acción mto16 Agenoma</param>
   ''' <remarks></remarks>
   Public Sub ActualizarAdjuntos(ByVal Accion As EAccion)
      Dim id As Integer = DevolverValorDelControl(p_CtrlContieneId)
      Dim txt As String = DevolverValorDelControl(p_CtrlContieneDescripcion)
      Dim sSubCarpeta As String = String.Format("{0} - {1}", id, txt).Trim
      Dim sCarpeta As String = p_strSubCarpetaindicada ' "agiKnowCliente"
      ''
      'Actualizar Información ADJUNTOS
      With Me
         .Carpeta = sCarpeta  '"acciones"
         .IDActual = id ' intidaccion.Value
         'Según si es Alta o Modificación cambia el orden pq
         'sino archivosAdjuntosAEliminar de Adjuntos no borra en las rutas correctas en modificación
         'o NombreSubcarpeta no es correcto en Alta
         If Accion = EAccion.Insercion Then ' Me.TipoMantenimiento = "Insertar" Then
            .SubCarpeta = sSubCarpeta 'NombreSubcarpeta 'drFila.Item("ParteID").ToString
            'Recorrer adjuntos para cambiarle la descripcion (si cabe pq. si eliminamos un adjunto ya lo comprueba por ej)
            .CambiarNombreAdjunto()
            '.ProcesarAccionesPendientes()... SC: PQ? Fuera
         Else
            '.ProcesarAccionesPendientes()... SC: PQ? Fuera
            .SubCarpeta = sSubCarpeta 'NombreSubcarpeta
            .CambiarNombreAdjunto()
         End If
      End With
   End Sub
   ''
   Public Sub GuardarAdjuntosAgenoma(ByVal strNombreSubcarpeta As String, _
                                     ByVal AgenomaAccion As Configuracion.AGeNomaCore.EAccion)
      'Dim NombreSubcarpeta As String = String.Empty

      'Actualizar Información ADJUNTOS
      'Según si es Alta o Modificación cambia el orden pq
      'sino archivosAdjuntosAEliminar de Adjuntos no borra en las rutas correctas en modificación
      'o NombreSubcarpeta no es correcto en Alta
      Select Case AgenomaAccion
         Case Insercion
            SubCarpeta = strNombreSubcarpeta  ' drFila("ParteID") & " - " & txtDescripcion.Text
            'Recorrer adjuntos para cambiarle la descripcion (si cabe pq. si eliminamos un adjunto ya lo comprueba por ej)
            CambiarNombreAdjunto()
            ProcesarAccionesPendientes()
         Case Modificacion 'EAccion.Consulta
            CorregirListaElminacionesAdjuntos()
            '.CorregirListaElminacionesAdjuntos(EntornoUI.PathAdjuntos & _
            '                                    "\agiKnowCliente\" & _
            '                                    NombreSubcarpeta) 'Solo cuando control adjuntos no se cierra al guardar (como un panel de agenoma)
            ProcesarAccionesPendientes()
            SubCarpeta = strNombreSubcarpeta
            CambiarNombreAdjunto()
      End Select
   End Sub

   Public Function ValidacionAdjuntosAgenoma(ByVal AgenomaAccion As Configuracion.AGeNomaCore.EAccion) As Boolean
      'Validaciones adjuntos
      Dim Ret As Boolean = True

      'With adjArchivos
      Select Case AgenomaAccion
         Case Insercion ' Insercion
            If CarpetaAdjuntosExisteyTieneFicheros(Me) Then Return False
         Case EAccion.Consulta, Modificacion ' Consulta, Modificacion
            'If MasDeUnIdEnCarpetaAdjuntos(i.agiKnowID, _
            '                               UbicacionRepositorio & "\" & _
            '                               Carpeta & "\") Then Ret = False : adjArchivos.Focus()
            If MasDeUnIdEnCarpetaAdjuntos(IDActual, UbicacionRepositorio & "\" & _
                                           Carpeta & "\") Then Ret = False : Focus()
      End Select
      'End With

      Return Ret
   End Function

   ''' <summary>
   ''' Reiniciar/Recargar el control de adjuntos
   ''' </summary>
   ''' <param name="strIdActual">Ej: 1 - Documentación. Sería el 1</param>
   ''' <param name="strDescripcion">Ej: 1 - Documentación. Sería el Documentación</param>
   ''' <param name="strCarpeta">Ej: Seria P:\Gproy\Adjuntos\Partes. Sería Partes</param>
   ''' <param name="AgenomaAccion">Ej: Acción del Agenoma: Insertar, Modificar, etc..</param>
   ''' <remarks></remarks>
   Public Sub ReiniciarControlAdjuntos(ByVal strIdActual As String, _
                                       ByRef strDescripcion As String, _
                                       ByVal strCarpeta As String, _
                                       ByVal AgenomaAccion As Configuracion.AGeNomaCore.EAccion)
      Exit Sub
      Dim NuevoNombre As String = String.Empty
      Dim bolSeguir As Boolean = True
      Dim DescripcionFinal As String = String.Empty
      Dim strSubcarpetaInicial As String = String.Empty

      'Establecer valores
      BorrarColeccionesDeDatos() 'Reiniciar/Limpieza
      UbicacionRepositorio = EntornoUI.PathAdjuntos 'Entorno.PathAdjuntos
      Carpeta = strCarpeta '"agiKnowCliente"
      IDActual = strIdActual 'i.agiKnowID '_intClaveID
      strSubcarpetaInicial = Controles.AGeUtiles.agiIsNull(strIdActual & " - " & strDescripcion.Trim, "") 'agiIsNull(strClaveParteMasDescripcion, "")
      SubCarpeta = strSubcarpetaInicial

      If AgenomaAccion = Insercion AndAlso CarpetaAdjuntosExisteyTieneFicheros(Me) Then bolSeguir = False
      If bolSeguir Then
         If Not String.IsNullOrEmpty(SubCarpeta) Then bolSeguir = CargarArchivos()
      End If

      If bolSeguir AndAlso (AgenomaAccion = Modificacion OrElse AgenomaAccion = EAccion.Consulta) Then
         'Sincronizar descripciones entre gproy y explorer
         DescripcionFinal = ComprobarDescripcionAdjuntosHaCambiado(SubCarpeta, _
                                                strSubcarpetaInicial, Carpeta)
         If DescripcionFinal <> String.Empty Then
            'RaiseEvent utmMantenimiento_ToolClick(Nothing, "Editar") '{Infragistics.Win.UltraWinToolbars.UltraToolbarsManager}
            strDescripcion = DescripcionFinal
            'i.agiKnowTitulo = DescripcionFinal

            'Windows.Forms.SendKeys.Send("{F11}") 'Editar
            'btnEditar()
         End If
      End If
      Enabled = False
   End Sub
   ''
   ''' <summary>
   ''' VAlidación del control adjuntos para Agenoma
   ''' </summary>
   ''' <param name="Accion"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Function ValidacionAdjuntos(ByVal Accion As EAccion) As Boolean
      Dim Ret As Boolean = True
      Try
         With Me
            If Accion = EAccion.Insercion Then 'If Me.TipoMantenimiento = "Insertar" Then
               If .CarpetaAdjuntosExisteyTieneFicheros(Me) Then Ret = False
            Else
               If .MasDeUnIdEnCarpetaAdjuntos(DevolverValorDelControl(p_CtrlContieneId), _
                           String.Format("{0}\{1}\", UbicacionRepositorio, Carpeta)) Then Ret = False
            End If
         End With
         Return Ret
         '
      Catch ex As Exception
         MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
         Return False
      End Try
      
   End Function
#End Region

End Class

